#!/bin/bash

# 日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S')  $*"
}

# 写入配置的函数
write_config() {
    local key=$1
    local value=$2
    local file=$3

    if [[ ! -f "$file" ]]; then
        log "文件 $file 不存在，创建新文件..."
        touch "$file"
    fi
    # 提取目录路径
    global_properties_dir=$(dirname "$file")

    # 检查并创建目录
    if [ ! -d "$global_properties_dir" ]; then
        echo "目录 $global_properties_dir 不存在，正在创建..."
        mkdir -p "$global_properties_dir"
    fi

    # 创建文件
    if [ ! -f "$file" ]; then
        echo "文件 $file 不存在，创建新文件..."
        touch "$file"
    fi

    # 对 value 进行转义，避免特殊字符引发 sed 替换失败
    local escaped_value
    escaped_value=$(echo "$value" | sed 's/[&/\]/\\&/g')

    # 如果 key 已存在，替换它的值；否则追加新的 key=value
    if grep -q "^$key=" "$file"; then
        # 替换已存在的键值对
        sed -i '' "s/^$key=.*/$key=$escaped_value/" "$file"
    else
        # 追加新的键值对
        echo "$key=$value" >> "$file"
    fi

    log "已更新配置：$key=$value 到文件 $file"
}

# 读取配置的函数
read_config() {
    local key=$1
    local file=$2

    if [[ ! -f "$file" ]]; then
        log "文件 $file 不存在，无法读取。"
        exit 1
    fi
    # 使用 grep 提取 key 的值，使用 `=` 分隔确保读取完整值
    local value
    value=$(grep -E "^$key=" "$file" | sed -E "s/^$key=//")
    echo "$value"
}

# 追加配置的函数
append_config() {
    local key=$1
    local new_value=$2
    local file=$3

    if [[ ! -f "$file" ]]; then
        log "文件 $file 不存在，创建新文件..."
        touch "$file"
    fi

    # 获取当前 key 的值
    local old_value
    old_value=$(read_config "$key" "$file")

    # 如果 key 存在且不为空，则追加新值；否则直接写入新值
    if [ -n "$old_value" ]; then
        # 确保不重复追加相同的值
        if [[ "$old_value" != *"$new_value"* ]]; then
            new_value="$old_value,$new_value"
        else
            log "值 '$new_value' 已存在于 '$key'，跳过追加。"
            return 0
        fi
    fi

    # 写入更新后的值
    write_config "$key" "$new_value" "$file"
}

# 主函数，解析命令行参数
main() {
    local action=$1
    local key=$2
    local value=$3
    local file=$4

    if [[ -z "$action" || -z "$key" || -z "$file" ]]; then
        echo "用法: $0 <action> <key> [<value>] <file>"
        echo "支持的 action: write_config, read_config, append_config"
        exit 1
    fi

    case "$action" in
        write_config)
            write_config "$key" "$value" "$file"
            ;;
        read_config)
            read_config "$key" "$file"
            ;;
        append_config)
            append_config "$key" "$value" "$file"
            ;;
        *)
            echo "不支持的操作：$action"
            exit 1
            ;;
    esac
}

main "$@"